// ============================== 导入依赖 ============================== //

import CORE from '../UTIL'
import util from './util'

const OneClass = {}

// ============================== 状态集 ============================== //

const state = {
  // —————————————————————————————— 数据 —————————————————————————————— //

  /**
   * 接口
   */
  API: {
    ...util.API,
    validOne(one, state, root) {
      return true
    },
    async getOne(one, TIP) {
      throw util.errorAPI(TIP, 'getOne')
    },
    transOne(obj, context) {
      return obj
    },
  },

  /**
   * 映射
   */
  MAP: {
    WORD: '', // 词语 (初始常量，不可更新)

    GET: null, // 获取 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    ONE: null, // 详情 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    tipOne: '', // 详情提示 (有值时直接使用，无值时拼接生成)
  },

  /**
   * 字典
   */
  DICT: {
    //
  },

  /**
   * 初始单项
   *
   * 1. 初始存在，才能响应
   * 2. CORE.mixStore(store) 时使用
   * 3. setOne() 重置时使用
   * 4. openAdd() 新增时使用
   */
  INIT_ONE: CORE.initObj(OneClass, {
    id: '',
  }),

  /**
   * 单项
   */
  one: {
    id: '',
  },

  /**
   * 表单
   *
   * async toSubmit() {
   *   await this.refForm.valid()
   * }
   */
  refForm: null,

  // —————————————————————————————— 开关 —————————————————————————————— //

  /**
   * 远程单项开关
   */
  needOne: false,

  /**
   * 单项就绪开关
   */
  readyOne: false,
}

// ============================== 计算属性 ============================== //

const getters = {}

// ============================== 同步更新 ============================== //

const mutations = {
  // —————————————————————————————— 设置 —————————————————————————————— //

  /**
   * 设置单项
   */
  setOne(state, one) {
    util.setClone(state, one, 'one')
  },

  /**
   * 设置表单
   */
  setRefForm(state, refForm) {
    state.refForm = refForm || null
  },

  // —————————————————————————————— 监听 —————————————————————————————— //

  /**
   * 开始远程单项
   */
  startOne(state, one) {
    const isObj = CORE.isJSON(one)
    if (state.API.validOne(isObj ? one : state.one, state, this)) {
      if (isObj) util.setClone(state, one, 'one') // 更新单项
      util.start('One', state)
    } else {
      util.setClone(state, {}, 'one')
    }
  },

  /**
   * 完成远程单项
   */
  completeOne(state, data) {
    let msgSuccess = ''
    if (CORE.isArray(data)) {
      if (CORE.isJSON(data[0])) util.setClone(state, data[0], 'one') // 设置单项
      if (CORE.isString(data[1])) msgSuccess = data[1] // 成功消息
    } else {
      if (CORE.isJSON(data)) util.setClone(state, data, 'one') // 设置单项
      if (CORE.isString(data)) msgSuccess = data // 成功消息
    }
    util.complete('One', state, msgSuccess)
  },

  /**
   * 终止远程单项
   */
  stopOne(state, e) {
    util.stop('One', state, e)
  },
}

// ============================== 异步调用 ============================== //

const actions = {
  // —————————————————————————————— 单项 —————————————————————————————— //

  async remoteOne(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipOne, this.state.API) // 拼上根模块 API 的菜单

    if (!API.validOne(one, context)) return {}

    const obj = await API.getOne(one, TIP)
    return API.transOne(obj, context)
  },
}

// ============================== 导出仓库 ============================== //

export default { state, getters, mutations, actions }
